/**
 * 递归过滤嵌套结构的数组
 *
 * 遍历一个嵌套结构（如树形结构）中的每一项，并返回所有满足条件的项组成的扁平数组。
 *
 * @template T - 元素类型
 * @param collection - 当前层级的元素数组
 * @param recurveKey - 用于访问子节点数组的属性名（如 "children"）
 * @param predicate - 过滤函数，对每一项进行判断，返回 true 表示保留该项
 * @returns 所有满足条件的项组成的一维数组（包括当前层和所有子层）
 *
 * @example
 * const tree = [
 *   {
 *     name: 'a',
 *     children: [{ name: 'a-1' }, { name: 'a-2' }]
 *   },
 *   {
 *     name: 'b',
 *     children: [{ name: 'b-1' }]
 *   }
 * ];
 * const result = recurveFilter(tree, 'children', node => node.name.includes('1'));
 * // result: [{ name: 'a-1' }, { name: 'b-1' }]
 */
export function filterRecurve<T>(
  collection: T[],
  recurveKey: string,
  predicate: (value: T, index: number, array: T[]) => unknown,
): T[] {
  // 递归退出条件
  if (collection.length === 0) {
    return [];
  }
  const filtered: T[] = [];
  const children: T[] = [];
  for (let i = 0, l = collection.length; i < l; i++) {
    const item = collection[i];
    if (predicate(item, i, collection)) {
      filtered.push(item);
    }
    // 将子项加入数组，用于进行下次递归
    if (item[recurveKey]) {
      children.push(...item[recurveKey]);
    }
  }
  filtered.push(...filterRecurve(children, recurveKey, predicate));
  return filtered;
}
